home *** CD-ROM | disk | FTP | other *** search
/ Steal This CD / steal_this_cd.iso / Chapter 07 - Where the Hackers Are / virc200.exe / {app} / Scripts / slidegame.vsc < prev    next >
Text File  |  2003-05-16  |  12KB  |  396 lines

  1. // Written at 1/19/2002 8:53:46 PM
  2. //@RBL_BEGIN   # Do not move or change this line
  3. @ $SlideForm = $new(TForm position 281,79,209,258)
  4. @p $SlideForm.BorderIcons = [biSystemMenu]
  5. @p $SlideForm.BorderStyle = bsSingle
  6. @p $SlideForm.Caption = Slide Game
  7. @p $SlideForm.ClientHeight = 231
  8. @p $SlideForm.ClientWidth = 201
  9. @p $SlideForm.Color = clBtnFace
  10. @p $SlideForm.Font.Charset = 1
  11. @p $SlideForm.Font.Color = clWindowText
  12. @p $SlideForm.Font.Name = MS Sans Serif
  13. @p $SlideForm.Font.Style = []
  14. @p $SlideForm.FormStyle = fsStayOnTop
  15. @p $SlideForm.OldCreateOrder = False
  16. @p $SlideForm.ShowHint = True
  17. @p $SlideForm.Visible = True
  18. @p $SlideForm.OnClose = _SlideForm_Close
  19. @p $SlideForm.OnDestroy = _SlideForm_Destroy
  20. @ $Button1 = $new(TButton ownedby $SlideForm position 8,8,41,41)
  21. @p $Button1.Caption = Button1
  22. @p $Button1.TabOrder = 1
  23. @p $Button1.OnClick = _ButtonN_Click
  24. @ $Button2 = $new(TButton ownedby $SlideForm position 56,8,41,41)
  25. @p $Button2.Caption = Button2
  26. @p $Button2.TabOrder = 2
  27. @p $Button2.OnClick = _ButtonN_Click
  28. @ $Button3 = $new(TButton ownedby $SlideForm position 104,8,41,41)
  29. @p $Button3.Caption = Button3
  30. @p $Button3.TabOrder = 3
  31. @p $Button3.OnClick = _ButtonN_Click
  32. @ $Button4 = $new(TButton ownedby $SlideForm position 152,8,41,41)
  33. @p $Button4.Caption = Button4
  34. @p $Button4.TabOrder = 4
  35. @p $Button4.OnClick = _ButtonN_Click
  36. @ $Button5 = $new(TButton ownedby $SlideForm position 8,56,41,41)
  37. @p $Button5.Caption = Button5
  38. @p $Button5.TabOrder = 5
  39. @p $Button5.OnClick = _ButtonN_Click
  40. @ $Button6 = $new(TButton ownedby $SlideForm position 56,56,41,41)
  41. @p $Button6.Caption = Button6
  42. @p $Button6.TabOrder = 6
  43. @p $Button6.OnClick = _ButtonN_Click
  44. @ $Button7 = $new(TButton ownedby $SlideForm position 104,56,41,41)
  45. @p $Button7.Caption = Button7
  46. @p $Button7.TabOrder = 7
  47. @p $Button7.OnClick = _ButtonN_Click
  48. @ $Button8 = $new(TButton ownedby $SlideForm position 152,56,41,41)
  49. @p $Button8.Caption = Button8
  50. @p $Button8.TabOrder = 8
  51. @p $Button8.OnClick = _ButtonN_Click
  52. @ $Button9 = $new(TButton ownedby $SlideForm position 8,104,41,41)
  53. @p $Button9.Caption = Button9
  54. @p $Button9.TabOrder = 9
  55. @p $Button9.OnClick = _ButtonN_Click
  56. @ $ShuffleButton = $new(TButton ownedby $SlideForm position 8,200,89,25)
  57. @p $ShuffleButton.Caption = Shuffle
  58. @p $ShuffleButton.TabOrder = 10
  59. @p $ShuffleButton.OnClick = _ShuffleButton_Click
  60. @ $Button10 = $new(TButton ownedby $SlideForm position 56,104,41,41)
  61. @p $Button10.Caption = Button10
  62. @p $Button10.TabOrder = 11
  63. @p $Button10.OnClick = _ButtonN_Click
  64. @ $Button11 = $new(TButton ownedby $SlideForm position 104,104,41,41)
  65. @p $Button11.Caption = Button11
  66. @p $Button11.TabOrder = 12
  67. @p $Button11.OnClick = _ButtonN_Click
  68. @ $Button12 = $new(TButton ownedby $SlideForm position 152,104,41,41)
  69. @p $Button12.Caption = Button12
  70. @p $Button12.TabOrder = 13
  71. @p $Button12.OnClick = _ButtonN_Click
  72. @ $Button13 = $new(TButton ownedby $SlideForm position 8,152,41,41)
  73. @p $Button13.Caption = Button13
  74. @p $Button13.TabOrder = 14
  75. @p $Button13.OnClick = _ButtonN_Click
  76. @ $Button14 = $new(TButton ownedby $SlideForm position 56,152,41,41)
  77. @p $Button14.Caption = Button14
  78. @p $Button14.TabOrder = 15
  79. @p $Button14.OnClick = _ButtonN_Click
  80. @ $Button15 = $new(TButton ownedby $SlideForm position 104,152,41,41)
  81. @p $Button15.Caption = Button15
  82. @p $Button15.TabOrder = 16
  83. @p $Button15.OnClick = _ButtonN_Click
  84. @ $Button16 = $new(TButton ownedby $SlideForm position 152,152,41,41)
  85. @p $Button16.Caption = Button16
  86. @p $Button16.TabOrder = 17
  87. @p $Button16.OnClick = _ButtonN_Click
  88. @ $CodeBtn = $new(TButton ownedby $SlideForm position 104,200,89,25)
  89. @p $CodeBtn.Hint = Click to enter a puzzle code
  90. @p $CodeBtn.Caption = CodeBtn
  91. @p $CodeBtn.TabOrder = 18
  92. @p $CodeBtn.OnClick = _CodeBtn_Click
  93. //@RBL_END   # Do not move or change this line
  94. // set up $Buttons[row,col]
  95. @ $Buttons[1,1] = $Button1
  96. @ $Buttons[1,2] = $Button2
  97. @ $Buttons[1,3] = $Button3
  98. @ $Buttons[1,4] = $Button4
  99. @ $Buttons[2,1] = $Button5
  100. @ $Buttons[2,2] = $Button6
  101. @ $Buttons[2,3] = $Button7
  102. @ $Buttons[2,4] = $Button8
  103. @ $Buttons[3,1] = $Button9
  104. @ $Buttons[3,2] = $Button10
  105. @ $Buttons[3,3] = $Button11
  106. @ $Buttons[3,4] = $Button12
  107. @ $Buttons[4,1] = $Button13
  108. @ $Buttons[4,2] = $Button14
  109. @ $Buttons[4,3] = $Button15
  110. @ $Buttons[4,4] = $Button16
  111.  
  112. Alias Slide_Disorder
  113.    @l $disorder = 0
  114.    @l $pattern = $1-
  115.    // don't count the space (16)
  116.    for (@l $i = 0; $i < 16; $i++)
  117.      continue if $listindex($i $pattern) == 16
  118.      for (@l $j = $($i + 1); $j < 16; $j++)
  119.        continue if $listindex($j $pattern) == 16
  120.        // if pattern[$i] > pattern [$j], this pair is disordered
  121.        if $listindex($i $pattern) > $listindex($j $pattern)
  122.          $disorder++
  123.        endif
  124.      endfor
  125.    endfor
  126.    @ $fresult = $disorder
  127. EndAlias
  128.  
  129. // Event parameters: $Sender
  130. Alias _ShuffleButton_Click
  131.    @ $Slide_Moves = 0
  132.    @l $doshuffle = 1
  133.    while $doshuffle
  134.      // space always comes last
  135.      @l $pattern = $listshuffle(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) 16
  136.      // measure disorder
  137.      @l $disorder = $slide_disorder($pattern)
  138.      //TOS clBlue Disorder: $disorder
  139.      if ($disorder % 2) == 0
  140.        // even disorder - solvable
  141.        @l $doshuffle = 0
  142.      endif
  143.    endwhile
  144.    if $Slide_FPU_DLL != 0
  145.      @p $CodeBtn.Caption = $Slide_PatternToCode($listremove(16 $pattern))
  146.    endif
  147.    // BUG - " " should work, not double-quoted <" ">
  148.    @l $pattern = $listsearchreplace(16 <" "> $pattern)
  149.    //TOS clGreen $pattern
  150.    @l $idx = 0
  151.    for (@l $i = 1; $i <= 4; $i++)
  152.      for (@l $j = 1; $j <= 4; $j++)
  153.        @l $x = $Buttons[$i,$j]
  154.        @p $x.Caption = $listindex($idx $pattern)
  155.        $idx++
  156.      endfor
  157.    endfor
  158. EndAlias
  159.  
  160. Alias Slide_GetPattern
  161.    @l $pattern = $null
  162.    for (@l $row = 1; $row <= 4; $row++)
  163.      for (@l $col = 1; $col <= 4; $col++)
  164.        @l $btn = $Buttons[$row,$col]
  165.        if [$prop($btn.Caption)] == [ ]
  166.          @l $num = 16
  167.        else
  168.          @l $num = $prop($btn.Caption)
  169.        endif
  170.        @l $pattern = $pattern $num
  171.      endfor
  172.    endfor
  173.    @ $fresult = $substr($pattern 2 99999)
  174. EndAlias
  175.  
  176. // Event parameters: $Sender
  177. Alias _ButtonN_Click
  178.    // find button's coordinates
  179.    @l $coords = $null
  180.    foreach ($key,$value; $Buttons)
  181.      if $value == $Sender
  182.        @l $coords = $key
  183.        break
  184.      endif
  185.    endforeach
  186.    Halt if [$coords] == []
  187.    
  188.    @l $row = $strtokl(, $coords)
  189.    @l $col = $strtokr(, $coords)
  190.    
  191.    @l $hole = $slide_findhole($row $col)
  192.    if [$hole] == []
  193.      Beep
  194.      Halt
  195.    endif
  196.    
  197.    $Slide_Moves++
  198.  
  199.    // swap captions
  200.    @l $thiscaption = $prop($Sender.Caption)
  201.    @l $that = $Buttons[$hole]
  202.    @l $thatcaption = $prop($that.Caption)
  203.    
  204.    @p $Sender.Caption = $thatcaption
  205.    @p $that.Caption = $thiscaption
  206.    
  207.    //TOS clBlue Disorder is now $slide_disorder($slide_getpattern())
  208.  
  209.    // check if solved
  210.    Slide_CheckSolve
  211. EndAlias
  212.  
  213. // Event parameters: $Sender, $Action (returned)
  214. Alias _SlideForm_Close
  215.    @l $Action = caFree
  216. EndAlias
  217.  
  218. Alias Slide_FindHole
  219.    @l $row = $1
  220.    @l $col = $2
  221.    @l $check = $($row-1),$col $($row+1),$col $row,$($col-1) $row,$($col+1)
  222.    
  223.    foreach ($i; $check)
  224.      @l $btn = $Buttons[$i]
  225.      continue if [$btn] == []
  226.      @l $caption = $prop($btn.Caption)
  227.      if [$caption] == [ ]
  228.        @ $fresult = $i
  229.        Halt
  230.      endif
  231.    endforeach
  232.    
  233.    @ $fresult = $null
  234. EndAlias
  235.  
  236. Alias Slide_CheckSolve
  237.    @l $expect = 1
  238.    for (@l $row = 1; $row <= 4; $row++)
  239.      //TOS clblack row $row
  240.      for (@l $col = 1; $col <= 4; $col++)
  241.        @l $btn = $Buttons[$row,$col]
  242.        //TOS clblack col $col, btn $btn, expecting [$expect]
  243.        if [$prop($btn.Caption)] != [$expect]
  244.          // didn't win
  245.          //messagebox no win
  246.          Halt
  247.        endif
  248.        // find next expected caption
  249.        if $expect == 15
  250.          // expect a space
  251.          @l $expect = $null $null
  252.        else
  253.          $expect++
  254.        endif
  255.      endfor
  256.    endfor
  257.    
  258.    // must have won
  259.    ^mtimer 100 5 beep
  260.    MessageBox You have won in $Slide_Moves moves.
  261. EndAlias
  262.  
  263. // Event parameters: $Sender
  264. Alias _SlideForm_Destroy
  265.    if $Slide_FPU_DLL != 0
  266.      FreeDLL $Slide_FPU_DLL
  267.    endif
  268. EndAlias
  269.  
  270. // fake int64 math using fpu.dll
  271. Alias _sladd
  272.    @ $fresult = $fadd($1 $2)
  273. EndAlias
  274.  
  275. Alias _slmul
  276.    @ $fresult = $fmul($1 $2)
  277. EndAlias
  278.  
  279. Alias _sldiv
  280.    @ $fresult = $strtokl(. $fdiv($1 $2))
  281. EndAlias
  282.  
  283. Alias _slmod
  284.    @ $fresult = $fsub($1 $fmul($_sldiv($1 $2) $2))
  285. EndAlias
  286.  
  287. // doesn't use letters "I" or "O" to avoid confusion
  288. @ $Slide_CodeLetters = 0 1 2 3 4 5 6 7 8 9 A B C D E F G H J K L M N P Q R S T U V W X Y Z
  289.  
  290. Alias _slltr2val
  291.    @ $fresult = $listindexof($1 $Slide_CodeLetters)
  292. EndAlias
  293.  
  294. Alias _slval2ltr
  295.    @ $fresult = $listindex($1 $Slide_CodeLetters)
  296. EndAlias
  297.  
  298. // stored patterns only have 15 values (space is always at the end)
  299. Alias Slide_CodeToPattern
  300.    // build integer code
  301.    @l $code = 0
  302.    @l $len = $length($1)
  303.    for (@l $i = 1; $i <= $len; $i++)
  304.      @l $code = $_sladd($_slmul($code 34) $_slltr2val($substr($1 $i 1)))
  305.    endfor
  306.    
  307.    // list of tiles left to assign
  308.    @l $tiles = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  309.  
  310.    @l $pattern = $null
  311.    for (@l $i = 15; $i >= 1; $i--)
  312.      @l $btn = $Buttons[$row,$col]
  313.      @l $choice = $_slmod($code $i)
  314.      @l $code = $_sldiv($code $i)
  315.      @l $pattern = $listcat($listindex($choice $tiles) $pattern)
  316.      @l $tiles = $listdelete($choice $tiles)
  317.    endfor
  318.    
  319.    @ $fresult = $pattern
  320. EndAlias
  321.  
  322. Alias Slide_PatternToCode
  323.    @l $pattern = $1-
  324.    
  325.    // list of tiles left to find
  326.    @l $tiles = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  327.    // array of saved choices
  328.    @l $choices = $null
  329.    
  330.    for (@l $i = 14; $i >= 0; $i--)
  331.      @l $value = $listindex($i $pattern)
  332.      @l $choice = $listindexof($value $tiles)
  333.      //TOS clGreen i=$i value="$value" choice="$choice" tiles="$tiles"
  334.      @l $choices[$i] = $choice
  335.      @l $tiles = $listremove($value $tiles)
  336.    endfor
  337.    
  338.    // build integer code
  339.    @l $code = 0
  340.    for (@l $i = 0; $i <= 14; $i++)
  341.    //TOS clBlue i=$i code is $code
  342.      @l $code = $_sladd($_slmul($code $($i+1)) $choices[$i])
  343.    endfor
  344.    
  345.    // change to letters
  346.    @l $codestr = $null
  347.    while [$code] != [0]
  348.      @l $codestr = $_slval2ltr($_slmod($code 34))$codestr
  349.      @l $code = $_sldiv($code 34)
  350.    endwhile
  351.    while $length($codestr) < 8
  352.      @l $codestr = 0$codestr
  353.    endwhile
  354.    
  355.    @ $fresult = $codestr
  356. EndAlias
  357.  
  358. // Event parameters: $Sender
  359. Alias _CodeBtn_Click
  360.    @l $code = $?="Enter the code of a game to play:|$prop($CodeBtn.Caption)"
  361.    Halt if [$code] == [INPUT_CANCELLED]
  362.    if $length($code) != 8
  363.      MessageBox The code must be 8 characters.
  364.      Halt
  365.    endif
  366.    
  367.    @l $pattern = $listcat($Slide_CodeToPattern($code) 16)
  368.    @l $disorder = $Slide_Disorder($pattern)
  369.    if ($disorder % 2) == 1
  370.      @l $ret = $messagedlg(52 The game you've chosen cannot be solved. Are you sure you want to try anyway?)
  371.      Halt if $ret == 7
  372.    endif
  373.    
  374.    @l $pattern = $listsearchreplace(16 <" "> $pattern)
  375.    @l $idx = 0
  376.    for (@l $row = 1; $row <= 4; $row++)
  377.      for (@l $col = 1; $col <= 4; $col++)
  378.        @l $btn = $Buttons[$row,$col]
  379.        @p $btn.Caption = $listindex($idx $pattern)
  380.        $idx++
  381.      endfor
  382.    endfor
  383.    
  384.    @p $CodeBtn.Caption = $upper($code)
  385. EndAlias
  386.  
  387. // need fpu.dll for the code button
  388. @ $Slide_FPU_DLL = $LoadDLL(fpu.dll)
  389. if $Slide_FPU_DLL == 0
  390.   @p $CodeBtn.Enabled = False
  391.   @p $CodeBtn.Hint = Need fpu.dll for code entry
  392. endif
  393.  
  394. _ShuffleButton_Click
  395.  
  396.